package com.yzqp.common.mvc.base;

import java.util.HashMap;
import java.util.Map;

/**
 * 基础枚举类
 *
 * @param <T> 继承BaseEnum的类型
 */
public interface BaseEnum<T extends BaseEnum> {

    public static Map<String, Map<String, BaseEnum>> enumMapMap = new HashMap<>(100);

    public abstract String getValue();

    public abstract String getName();

    /**
     * 反序列化
     *
     * @param enumType 实际枚举类型
     * @param value    当前值
     * @param <T>      枚举类型并且实现 {@link BaseEnum} 接口
     * @return 枚举常量
     */
    public static BaseEnum valueOf(Class<BaseEnum> enumType, Object value) {
        if (enumType == null || value == null) {
            return null;
        }
        Map<String, BaseEnum> map = enumMapMap.get(enumType.getName());
        if(value instanceof BaseEnum){
            return (BaseEnum) value;
        }
        if (map == null) {
            initEnumMap(enumType);
            map = enumMapMap.get(enumType.getName());
        }
        return map.get(value);
    }

    public static void initEnumMap(Class<BaseEnum> enumType) {
        BaseEnum[] enumConstants = enumType.getEnumConstants();
        Map<String, BaseEnum> map = new HashMap<>();
        for (BaseEnum enumConstant : enumConstants) {
            String value = enumConstant.getValue();
            String lowerValue = value.toLowerCase();
            map.put(lowerValue, enumConstant);
            String upperValue = value.toUpperCase();
            map.put(upperValue, enumConstant);
        }
        BaseEnum.enumMapMap.put(enumType.getName(), map);
    }
}
